PS SAMPLES PART 4

PSEUDO-BULK ANALYSIS

DIFFERENTIAL TESTING BETWEEN CONDITIONS - LESIONAL, NON-LESIONAL AND HEALTHY

FIGURE NO DESCRIPTION LINK
6A Hierarchical clustering based heatmap for all samples link
6B PCA plot for all samples - grouped by PS group link
6C PCA plot for all samples - grouped by Disease severity link
S9 Dendogram for all samples link
S10 PCA plots - per cluster bass (PS samples only) link

Import the Seurat object

skin_data.hm.sct <- readRDS(file="../ALL_SPATIAL_SAMPLES.RDS")

RE-NORMALIZING TO REGRESS OUT BATCH

skin_data.hm.sct_re_normalized <- SCTransform(skin_data.hm.sct,assay = "Spatial",new.assay.name ="SCT_BATCH_REGRESSED",vars.to.regress = c("sample.id"))
Calculating cell attributes from input UMI matrix: log_umi
Variance stabilizing transformation of count matrix of size 21901 by 16424
Model formula is y ~ log_umi
Get Negative Binomial regression parameters per gene
Using 2000 genes, 5000 cells

  |                                                                                                                                   
  |                                                                                                                             |   0%
  |                                                                                                                                   
  |===============================                                                                                              |  25%
  |                                                                                                                                   
  |==============================================================                                                               |  50%
  |                                                                                                                                   
  |==============================================================================================                               |  75%
  |                                                                                                                                   
  |=============================================================================================================================| 100%
Found 70 outliers - those will be ignored in fitting/regularization step

Second step: Get residuals using fitted parameters for 21901 genes

  |                                                                                                                                   
  |                                                                                                                             |   0%
  |                                                                                                                                   
  |===                                                                                                                          |   2%
  |                                                                                                                                   
  |======                                                                                                                       |   5%
  |                                                                                                                                   
  |=========                                                                                                                    |   7%
  |                                                                                                                                   
  |===========                                                                                                                  |   9%
  |                                                                                                                                   
  |==============                                                                                                               |  11%
  |                                                                                                                                   
  |=================                                                                                                            |  14%
  |                                                                                                                                   
  |====================                                                                                                         |  16%
  |                                                                                                                                   
  |=======================                                                                                                      |  18%
  |                                                                                                                                   
  |==========================                                                                                                   |  20%
  |                                                                                                                                   
  |============================                                                                                                 |  23%
  |                                                                                                                                   
  |===============================                                                                                              |  25%
  |                                                                                                                                   
  |==================================                                                                                           |  27%
  |                                                                                                                                   
  |=====================================                                                                                        |  30%
  |                                                                                                                                   
  |========================================                                                                                     |  32%
  |                                                                                                                                   
  |===========================================                                                                                  |  34%
  |                                                                                                                                   
  |=============================================                                                                                |  36%
  |                                                                                                                                   
  |================================================                                                                             |  39%
  |                                                                                                                                   
  |===================================================                                                                          |  41%
  |                                                                                                                                   
  |======================================================                                                                       |  43%
  |                                                                                                                                   
  |=========================================================                                                                    |  45%
  |                                                                                                                                   
  |============================================================                                                                 |  48%
  |                                                                                                                                   
  |==============================================================                                                               |  50%
  |                                                                                                                                   
  |=================================================================                                                            |  52%
  |                                                                                                                                   
  |====================================================================                                                         |  55%
  |                                                                                                                                   
  |=======================================================================                                                      |  57%
  |                                                                                                                                   
  |==========================================================================                                                   |  59%
  |                                                                                                                                   
  |=============================================================================                                                |  61%
  |                                                                                                                                   
  |================================================================================                                             |  64%
  |                                                                                                                                   
  |==================================================================================                                           |  66%
  |                                                                                                                                   
  |=====================================================================================                                        |  68%
  |                                                                                                                                   
  |========================================================================================                                     |  70%
  |                                                                                                                                   
  |===========================================================================================                                  |  73%
  |                                                                                                                                   
  |==============================================================================================                               |  75%
  |                                                                                                                                   
  |=================================================================================================                            |  77%
  |                                                                                                                                   
  |===================================================================================================                          |  80%
  |                                                                                                                                   
  |======================================================================================================                       |  82%
  |                                                                                                                                   
  |=========================================================================================================                    |  84%
  |                                                                                                                                   
  |============================================================================================================                 |  86%
  |                                                                                                                                   
  |===============================================================================================================              |  89%
  |                                                                                                                                   
  |==================================================================================================================           |  91%
  |                                                                                                                                   
  |====================================================================================================================         |  93%
  |                                                                                                                                   
  |=======================================================================================================================      |  95%
  |                                                                                                                                   
  |==========================================================================================================================   |  98%
  |                                                                                                                                   
  |=============================================================================================================================| 100%
Computing corrected count matrix for 21901 genes

  |                                                                                                                                   
  |                                                                                                                             |   0%
  |                                                                                                                                   
  |===                                                                                                                          |   2%
  |                                                                                                                                   
  |======                                                                                                                       |   5%
  |                                                                                                                                   
  |=========                                                                                                                    |   7%
  |                                                                                                                                   
  |===========                                                                                                                  |   9%
  |                                                                                                                                   
  |==============                                                                                                               |  11%
  |                                                                                                                                   
  |=================                                                                                                            |  14%
  |                                                                                                                                   
  |====================                                                                                                         |  16%
  |                                                                                                                                   
  |=======================                                                                                                      |  18%
  |                                                                                                                                   
  |==========================                                                                                                   |  20%
  |                                                                                                                                   
  |============================                                                                                                 |  23%
  |                                                                                                                                   
  |===============================                                                                                              |  25%
  |                                                                                                                                   
  |==================================                                                                                           |  27%
  |                                                                                                                                   
  |=====================================                                                                                        |  30%
  |                                                                                                                                   
  |========================================                                                                                     |  32%
  |                                                                                                                                   
  |===========================================                                                                                  |  34%
  |                                                                                                                                   
  |=============================================                                                                                |  36%
  |                                                                                                                                   
  |================================================                                                                             |  39%
  |                                                                                                                                   
  |===================================================                                                                          |  41%
  |                                                                                                                                   
  |======================================================                                                                       |  43%
  |                                                                                                                                   
  |=========================================================                                                                    |  45%
  |                                                                                                                                   
  |============================================================                                                                 |  48%
  |                                                                                                                                   
  |==============================================================                                                               |  50%
  |                                                                                                                                   
  |=================================================================                                                            |  52%
  |                                                                                                                                   
  |====================================================================                                                         |  55%
  |                                                                                                                                   
  |=======================================================================                                                      |  57%
  |                                                                                                                                   
  |==========================================================================                                                   |  59%
  |                                                                                                                                   
  |=============================================================================                                                |  61%
  |                                                                                                                                   
  |================================================================================                                             |  64%
  |                                                                                                                                   
  |==================================================================================                                           |  66%
  |                                                                                                                                   
  |=====================================================================================                                        |  68%
  |                                                                                                                                   
  |========================================================================================                                     |  70%
  |                                                                                                                                   
  |===========================================================================================                                  |  73%
  |                                                                                                                                   
  |==============================================================================================                               |  75%
  |                                                                                                                                   
  |=================================================================================================                            |  77%
  |                                                                                                                                   
  |===================================================================================================                          |  80%
  |                                                                                                                                   
  |======================================================================================================                       |  82%
  |                                                                                                                                   
  |=========================================================================================================                    |  84%
  |                                                                                                                                   
  |============================================================================================================                 |  86%
  |                                                                                                                                   
  |===============================================================================================================              |  89%
  |                                                                                                                                   
  |==================================================================================================================           |  91%
  |                                                                                                                                   
  |====================================================================================================================         |  93%
  |                                                                                                                                   
  |=======================================================================================================================      |  95%
  |                                                                                                                                   
  |==========================================================================================================================   |  98%
  |                                                                                                                                   
  |=============================================================================================================================| 100%
Calculating gene attributes
Wall clock passed: Time difference of 3.035921 mins
Determine variable features
Place corrected count matrix in counts slot
Regressing out sample.id

  |                                                                                                                                   
  |                                                                                                                             |   0%
  |                                                                                                                                   
  |=                                                                                                                            |   0%
  |                                                                                                                                   
  |=                                                                                                                            |   1%
  |                                                                                                                                   
  |==                                                                                                                           |   1%
  |                                                                                                                                   
  |==                                                                                                                           |   2%
  |                                                                                                                                   
  |===                                                                                                                          |   2%
  |                                                                                                                                   
  |===                                                                                                                          |   3%
  |                                                                                                                                   
  |====                                                                                                                         |   3%
  |                                                                                                                                   
  |====                                                                                                                         |   4%
  |                                                                                                                                   
  |=====                                                                                                                        |   4%
  |                                                                                                                                   
  |======                                                                                                                       |   4%
  |                                                                                                                                   
  |======                                                                                                                       |   5%
  |                                                                                                                                   
  |=======                                                                                                                      |   5%
  |                                                                                                                                   
  |=======                                                                                                                      |   6%
  |                                                                                                                                   
  |========                                                                                                                     |   6%
  |                                                                                                                                   
  |========                                                                                                                     |   7%
  |                                                                                                                                   
  |=========                                                                                                                    |   7%
  |                                                                                                                                   
  |=========                                                                                                                    |   8%
  |                                                                                                                                   
  |==========                                                                                                                   |   8%
  |                                                                                                                                   
  |===========                                                                                                                  |   8%
  |                                                                                                                                   
  |===========                                                                                                                  |   9%
  |                                                                                                                                   
  |============                                                                                                                 |   9%
  |                                                                                                                                   
  |============                                                                                                                 |  10%
  |                                                                                                                                   
  |=============                                                                                                                |  10%
  |                                                                                                                                   
  |=============                                                                                                                |  11%
  |                                                                                                                                   
  |==============                                                                                                               |  11%
  |                                                                                                                                   
  |==============                                                                                                               |  12%
  |                                                                                                                                   
  |===============                                                                                                              |  12%
  |                                                                                                                                   
  |================                                                                                                             |  12%
  |                                                                                                                                   
  |================                                                                                                             |  13%
  |                                                                                                                                   
  |=================                                                                                                            |  13%
  |                                                                                                                                   
  |=================                                                                                                            |  14%
  |                                                                                                                                   
  |==================                                                                                                           |  14%
  |                                                                                                                                   
  |==================                                                                                                           |  15%
  |                                                                                                                                   
  |===================                                                                                                          |  15%
  |                                                                                                                                   
  |===================                                                                                                          |  16%
  |                                                                                                                                   
  |====================                                                                                                         |  16%
  |                                                                                                                                   
  |=====================                                                                                                        |  16%
  |                                                                                                                                   
  |=====================                                                                                                        |  17%
  |                                                                                                                                   
  |======================                                                                                                       |  17%
  |                                                                                                                                   
  |======================                                                                                                       |  18%
  |                                                                                                                                   
  |=======================                                                                                                      |  18%
  |                                                                                                                                   
  |=======================                                                                                                      |  19%
  |                                                                                                                                   
  |========================                                                                                                     |  19%
  |                                                                                                                                   
  |========================                                                                                                     |  20%
  |                                                                                                                                   
  |=========================                                                                                                    |  20%
  |                                                                                                                                   
  |==========================                                                                                                   |  20%
  |                                                                                                                                   
  |==========================                                                                                                   |  21%
  |                                                                                                                                   
  |===========================                                                                                                  |  21%
  |                                                                                                                                   
  |===========================                                                                                                  |  22%
  |                                                                                                                                   
  |============================                                                                                                 |  22%
  |                                                                                                                                   
  |============================                                                                                                 |  23%
  |                                                                                                                                   
  |=============================                                                                                                |  23%
  |                                                                                                                                   
  |=============================                                                                                                |  24%
  |                                                                                                                                   
  |==============================                                                                                               |  24%
  |                                                                                                                                   
  |===============================                                                                                              |  24%
  |                                                                                                                                   
  |===============================                                                                                              |  25%
  |                                                                                                                                   
  |================================                                                                                             |  25%
  |                                                                                                                                   
  |================================                                                                                             |  26%
  |                                                                                                                                   
  |=================================                                                                                            |  26%
  |                                                                                                                                   
  |=================================                                                                                            |  27%
  |                                                                                                                                   
  |==================================                                                                                           |  27%
  |                                                                                                                                   
  |==================================                                                                                           |  28%
  |                                                                                                                                   
  |===================================                                                                                          |  28%
  |                                                                                                                                   
  |====================================                                                                                         |  28%
  |                                                                                                                                   
  |====================================                                                                                         |  29%
  |                                                                                                                                   
  |=====================================                                                                                        |  29%
  |                                                                                                                                   
  |=====================================                                                                                        |  30%
  |                                                                                                                                   
  |======================================                                                                                       |  30%
  |                                                                                                                                   
  |======================================                                                                                       |  31%
  |                                                                                                                                   
  |=======================================                                                                                      |  31%
  |                                                                                                                                   
  |=======================================                                                                                      |  32%
  |                                                                                                                                   
  |========================================                                                                                     |  32%
  |                                                                                                                                   
  |=========================================                                                                                    |  32%
  |                                                                                                                                   
  |=========================================                                                                                    |  33%
  |                                                                                                                                   
  |==========================================                                                                                   |  33%
  |                                                                                                                                   
  |==========================================                                                                                   |  34%
  |                                                                                                                                   
  |===========================================                                                                                  |  34%
  |                                                                                                                                   
  |===========================================                                                                                  |  35%
  |                                                                                                                                   
  |============================================                                                                                 |  35%
  |                                                                                                                                   
  |============================================                                                                                 |  36%
  |                                                                                                                                   
  |=============================================                                                                                |  36%
  |                                                                                                                                   
  |==============================================                                                                               |  36%
  |                                                                                                                                   
  |==============================================                                                                               |  37%
  |                                                                                                                                   
  |===============================================                                                                              |  37%
  |                                                                                                                                   
  |===============================================                                                                              |  38%
  |                                                                                                                                   
  |================================================                                                                             |  38%
  |                                                                                                                                   
  |================================================                                                                             |  39%
  |                                                                                                                                   
  |=================================================                                                                            |  39%
  |                                                                                                                                   
  |=================================================                                                                            |  40%
  |                                                                                                                                   
  |==================================================                                                                           |  40%
  |                                                                                                                                   
  |===================================================                                                                          |  40%
  |                                                                                                                                   
  |===================================================                                                                          |  41%
  |                                                                                                                                   
  |====================================================                                                                         |  41%
  |                                                                                                                                   
  |====================================================                                                                         |  42%
  |                                                                                                                                   
  |=====================================================                                                                        |  42%
  |                                                                                                                                   
  |=====================================================                                                                        |  43%
  |                                                                                                                                   
  |======================================================                                                                       |  43%
  |                                                                                                                                   
  |======================================================                                                                       |  44%
  |                                                                                                                                   
  |=======================================================                                                                      |  44%
  |                                                                                                                                   
  |========================================================                                                                     |  44%
  |                                                                                                                                   
  |========================================================                                                                     |  45%
  |                                                                                                                                   
  |=========================================================                                                                    |  45%
  |                                                                                                                                   
  |=========================================================                                                                    |  46%
  |                                                                                                                                   
  |==========================================================                                                                   |  46%
  |                                                                                                                                   
  |==========================================================                                                                   |  47%
  |                                                                                                                                   
  |===========================================================                                                                  |  47%
  |                                                                                                                                   
  |===========================================================                                                                  |  48%
  |                                                                                                                                   
  |============================================================                                                                 |  48%
  |                                                                                                                                   
  |=============================================================                                                                |  48%
  |                                                                                                                                   
  |=============================================================                                                                |  49%
  |                                                                                                                                   
  |==============================================================                                                               |  49%
  |                                                                                                                                   
  |==============================================================                                                               |  50%
  |                                                                                                                                   
  |===============================================================                                                              |  50%
  |                                                                                                                                   
  |===============================================================                                                              |  51%
  |                                                                                                                                   
  |================================================================                                                             |  51%
  |                                                                                                                                   
  |================================================================                                                             |  52%
  |                                                                                                                                   
  |=================================================================                                                            |  52%
  |                                                                                                                                   
  |==================================================================                                                           |  52%
  |                                                                                                                                   
  |==================================================================                                                           |  53%
  |                                                                                                                                   
  |===================================================================                                                          |  53%
  |                                                                                                                                   
  |===================================================================                                                          |  54%
  |                                                                                                                                   
  |====================================================================                                                         |  54%
  |                                                                                                                                   
  |====================================================================                                                         |  55%
  |                                                                                                                                   
  |=====================================================================                                                        |  55%
  |                                                                                                                                   
  |=====================================================================                                                        |  56%
  |                                                                                                                                   
  |======================================================================                                                       |  56%
  |                                                                                                                                   
  |=======================================================================                                                      |  56%
  |                                                                                                                                   
  |=======================================================================                                                      |  57%
  |                                                                                                                                   
  |========================================================================                                                     |  57%
  |                                                                                                                                   
  |========================================================================                                                     |  58%
  |                                                                                                                                   
  |=========================================================================                                                    |  58%
  |                                                                                                                                   
  |=========================================================================                                                    |  59%
  |                                                                                                                                   
  |==========================================================================                                                   |  59%
  |                                                                                                                                   
  |==========================================================================                                                   |  60%
  |                                                                                                                                   
  |===========================================================================                                                  |  60%
  |                                                                                                                                   
  |============================================================================                                                 |  60%
  |                                                                                                                                   
  |============================================================================                                                 |  61%
  |                                                                                                                                   
  |=============================================================================                                                |  61%
  |                                                                                                                                   
  |=============================================================================                                                |  62%
  |                                                                                                                                   
  |==============================================================================                                               |  62%
  |                                                                                                                                   
  |==============================================================================                                               |  63%
  |                                                                                                                                   
  |===============================================================================                                              |  63%
  |                                                                                                                                   
  |===============================================================================                                              |  64%
  |                                                                                                                                   
  |================================================================================                                             |  64%
  |                                                                                                                                   
  |=================================================================================                                            |  64%
  |                                                                                                                                   
  |=================================================================================                                            |  65%
  |                                                                                                                                   
  |==================================================================================                                           |  65%
  |                                                                                                                                   
  |==================================================================================                                           |  66%
  |                                                                                                                                   
  |===================================================================================                                          |  66%
  |                                                                                                                                   
  |===================================================================================                                          |  67%
  |                                                                                                                                   
  |====================================================================================                                         |  67%
  |                                                                                                                                   
  |====================================================================================                                         |  68%
  |                                                                                                                                   
  |=====================================================================================                                        |  68%
  |                                                                                                                                   
  |======================================================================================                                       |  68%
  |                                                                                                                                   
  |======================================================================================                                       |  69%
  |                                                                                                                                   
  |=======================================================================================                                      |  69%
  |                                                                                                                                   
  |=======================================================================================                                      |  70%
  |                                                                                                                                   
  |========================================================================================                                     |  70%
  |                                                                                                                                   
  |========================================================================================                                     |  71%
  |                                                                                                                                   
  |=========================================================================================                                    |  71%
  |                                                                                                                                   
  |=========================================================================================                                    |  72%
  |                                                                                                                                   
  |==========================================================================================                                   |  72%
  |                                                                                                                                   
  |===========================================================================================                                  |  72%
  |                                                                                                                                   
  |===========================================================================================                                  |  73%
  |                                                                                                                                   
  |============================================================================================                                 |  73%
  |                                                                                                                                   
  |============================================================================================                                 |  74%
  |                                                                                                                                   
  |=============================================================================================                                |  74%
  |                                                                                                                                   
  |=============================================================================================                                |  75%
  |                                                                                                                                   
  |==============================================================================================                               |  75%
  |                                                                                                                                   
  |==============================================================================================                               |  76%
  |                                                                                                                                   
  |===============================================================================================                              |  76%
  |                                                                                                                                   
  |================================================================================================                             |  76%
  |                                                                                                                                   
  |================================================================================================                             |  77%
  |                                                                                                                                   
  |=================================================================================================                            |  77%
  |                                                                                                                                   
  |=================================================================================================                            |  78%
  |                                                                                                                                   
  |==================================================================================================                           |  78%
  |                                                                                                                                   
  |==================================================================================================                           |  79%
  |                                                                                                                                   
  |===================================================================================================                          |  79%
  |                                                                                                                                   
  |===================================================================================================                          |  80%
  |                                                                                                                                   
  |====================================================================================================                         |  80%
  |                                                                                                                                   
  |=====================================================================================================                        |  80%
  |                                                                                                                                   
  |=====================================================================================================                        |  81%
  |                                                                                                                                   
  |======================================================================================================                       |  81%
  |                                                                                                                                   
  |======================================================================================================                       |  82%
  |                                                                                                                                   
  |=======================================================================================================                      |  82%
  |                                                                                                                                   
  |=======================================================================================================                      |  83%
  |                                                                                                                                   
  |========================================================================================================                     |  83%
  |                                                                                                                                   
  |========================================================================================================                     |  84%
  |                                                                                                                                   
  |=========================================================================================================                    |  84%
  |                                                                                                                                   
  |==========================================================================================================                   |  84%
  |                                                                                                                                   
  |==========================================================================================================                   |  85%
  |                                                                                                                                   
  |===========================================================================================================                  |  85%
  |                                                                                                                                   
  |===========================================================================================================                  |  86%
  |                                                                                                                                   
  |============================================================================================================                 |  86%
  |                                                                                                                                   
  |============================================================================================================                 |  87%
  |                                                                                                                                   
  |=============================================================================================================                |  87%
  |                                                                                                                                   
  |=============================================================================================================                |  88%
  |                                                                                                                                   
  |==============================================================================================================               |  88%
  |                                                                                                                                   
  |===============================================================================================================              |  88%
  |                                                                                                                                   
  |===============================================================================================================              |  89%
  |                                                                                                                                   
  |================================================================================================================             |  89%
  |                                                                                                                                   
  |================================================================================================================             |  90%
  |                                                                                                                                   
  |=================================================================================================================            |  90%
  |                                                                                                                                   
  |=================================================================================================================            |  91%
  |                                                                                                                                   
  |==================================================================================================================           |  91%
  |                                                                                                                                   
  |==================================================================================================================           |  92%
  |                                                                                                                                   
  |===================================================================================================================          |  92%
  |                                                                                                                                   
  |====================================================================================================================         |  92%
  |                                                                                                                                   
  |====================================================================================================================         |  93%
  |                                                                                                                                   
  |=====================================================================================================================        |  93%
  |                                                                                                                                   
  |=====================================================================================================================        |  94%
  |                                                                                                                                   
  |======================================================================================================================       |  94%
  |                                                                                                                                   
  |======================================================================================================================       |  95%
  |                                                                                                                                   
  |=======================================================================================================================      |  95%
  |                                                                                                                                   
  |=======================================================================================================================      |  96%
  |                                                                                                                                   
  |========================================================================================================================     |  96%
  |                                                                                                                                   
  |=========================================================================================================================    |  96%
  |                                                                                                                                   
  |=========================================================================================================================    |  97%
  |                                                                                                                                   
  |==========================================================================================================================   |  97%
  |                                                                                                                                   
  |==========================================================================================================================   |  98%
  |                                                                                                                                   
  |===========================================================================================================================  |  98%
  |                                                                                                                                   
  |===========================================================================================================================  |  99%
  |                                                                                                                                   
  |============================================================================================================================ |  99%
  |                                                                                                                                   
  |============================================================================================================================ | 100%
  |                                                                                                                                   
  |=============================================================================================================================| 100%
Centering data matrix

  |                                                                                                                                   
  |                                                                                                                             |   0%
  |                                                                                                                                   
  |===============================                                                                                              |  25%
  |                                                                                                                                   
  |==============================================================                                                               |  50%
  |                                                                                                                                   
  |==============================================================================================                               |  75%
  |                                                                                                                                   
  |=============================================================================================================================| 100%
Warning: Keys should be one or more alphanumeric characters followed by an underscore, setting key from sct_batch_regressed_ to sctbatchregressed_Set default assay to SCT_BATCH_REGRESSED

IDENTIFY DE GENES - LESIONAL VS HEALTHY

LES_vs_HEALTHY_v1 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Healthy skin")
Error in FindMarkers(skin_data.hm.sct_re_normalized, group.by = "DISEASE_STATUS",  : 
  object 'skin_data.hm.sct_re_normalized' not found
NON_LES_vs_HEALTHY <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Non-Lesional",ident.2 = "Healthy skin")
LES_VS_NON_LES <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Non-Lesional")
skin_data.hm.sct_re_normalized <- NormalizeData(skin_data.hm.sct_re_normalized,assay = "Spatial")
LES_vs_HEALTHY_v3 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Healthy skin",assay = "Spatial",test.use = "LR",latent.vars=c("Batch"))

NON_LES_vs_HEALTHY_v3 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Non-Lesional",ident.2 = "Healthy skin",assay = "Spatial",test.use = "LR",latent.vars=c("Batch"))

LES_VS_NON_LES_v3 <- FindMarkers(skin_data.hm.sct,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Non-Lesional",assay = "Spatial",test.use = "LR",latent.vars=c("Batch"))
LES_vs_HEALTHY_v4 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Healthy skin",assay = "Spatial",test.use = "wilcox")

NON_LES_vs_HEALTHY_v4 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Non-Lesional",ident.2 = "Healthy skin",assay = "Spatial",test.use = "wilcox")

LES_VS_NON_LES_v4 <- FindMarkers(skin_data.hm.sct,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Non-Lesional",assay = "Spatial",test.use = "wilcox")
LES_vs_HEALTHY_v3_filtered <- LES_vs_HEALTHY_v3 %>% filter(p_val_adj<=0.1)
NON_LES_vs_HEALTHY_v3_filtered <- NON_LES_vs_HEALTHY_v3 %>% filter(p_val_adj<=0.1)
LES_VS_NON_LES_v3_filtered <- LES_VS_NON_LES_v3 %>% filter(p_val_adj<=0.1)

LES_vs_HEALTHY_v4_filtered <- LES_vs_HEALTHY_v4 %>% filter(p_val_adj<=0.1)
NON_LES_vs_HEALTHY_v4_filtered <- NON_LES_vs_HEALTHY_v4 %>% filter(p_val_adj<=0.1)
LES_VS_NON_LES_v4_filtered <- LES_VS_NON_LES_v4 %>% filter(p_val_adj<=0.1)
write.csv(LES_vs_HEALTHY_v3_filtered,file="DE_RESULTS_LES_vs_HEALTHY_(LR_TEST).csv")
write.csv(NON_LES_vs_HEALTHY_v3_filtered,file="DE_RESULTS_NON_LES_vs_HEALTHY_(LR_TEST).csv")
write.csv(LES_VS_NON_LES_v3_filtered,file="DE_RESULTS_LES_VS_NON_LES_(LR_TEST).csv")

write.csv(LES_vs_HEALTHY_v4_filtered,file="DE_RESULTS_LES_vs_HEALTHY_(WILCOX_TEST).csv")
write.csv(NON_LES_vs_HEALTHY_v4_filtered,file="DE_RESULTS_NON_LES_vs_HEALTHY_(WILCOX_TEST).csv")
write.csv(LES_VS_NON_LES_v4_filtered,file="DE_RESULTS_LES_VS_NON_LES_(WILCOX_TEST).csv")
LES_vs_HEALTHY_v4 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Healthy skin",assay = "Spatial",test.use = "LR",latent.vars=c("sample.id"))
NON_LES_vs_HEALTHY_v4 <- FindMarkers(skin_data.hm.sct_re_normalized,group.by = "DISEASE_STATUS",ident.1 = "Non-Lesional",ident.2 = "Healthy skin",assay = "Spatial",test.use = "LR",latent.vars=c("sample.id"))
LES_VS_NON_LES_v4 <- FindMarkers(skin_data.hm.sct,group.by = "DISEASE_STATUS",ident.1 = "Lesional",ident.2 = "Non-Lesional",assay = "Spatial",test.use = "LR",latent.vars=c("sample.id"))
LES_vs_HEALTHY_v4_filtered <- LES_vs_HEALTHY_v4 %>% filter(p_val_adj<=0.1)
NON_LES_vs_HEALTHY_v4_filtered <- NON_LES_vs_HEALTHY_v4 %>% filter(p_val_adj<=0.1)
LES_VS_NON_LES_v4_filtered <- LES_VS_NON_LES_v4 %>% filter(p_val_adj<=0.1)
write.csv(LES_vs_HEALTHY_v4_filtered,file="DE_RESULTS_LES_vs_HEALTHY_(LR_TEST)(SAMPLE_VAR).csv")
write.csv(NON_LES_vs_HEALTHY_v4_filtered,file="DE_RESULTS_NON_LES_vs_HEALTHY_(LR_TEST)(SAMPLE_VAR).csv")
write.csv(LES_VS_NON_LES_v4_filtered,file="DE_RESULTS_LES_VS_NON_LES_(LR_TEST)(SAMPLE_VAR).csv")

PSEUDO-BULK APPROACH

Import Pseudo-counts from the Seurat object

pseudo.counts <- Seurat:::PseudobulkExpression(object = skin_data.hm.sct,assays = "Spatial",group.by = "sample.id",slot = "counts",pb.method = "aggregate") 

summary(colSums(pseudo.counts$Spatial))
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
  211576   963567  1826699  2826222  4051790 10120020 
colSums(pseudo.counts$Spatial>10)
     HV1_S1_R1      HV1_S1_R2      HV2_S1_R1      HV2_S1_R2         HV2_S2         HV3_S1         HV3_S2     PSA_LES_P1  PSA_LES_P2_R1 
          9100           9105          10190          12563           7489          11816          10507          13152          10717 
 PSA_LES_P2_R2  PSA_LES_P3_R1  PSA_LES_P3_R2     PSA_LES_P4     PSA_LES_P5 PSA_NON_LES_P1 PSA_NON_LES_P2 PSA_NON_LES_P3 PSA_NON_LES_P4 
         13651           8690          13803          12429          12463          10040           8428          12828          11984 
    PSO_LES_P1  PSO_LES_P2_R1  PSO_LES_P2_R2     PSO_LES_P3     PSO_LES_P4     PSO_LES_P5     PSO_LES_P6 PSO_NON_LES_P1 PSO_NON_LES_P2 
         12697           8031          13411          10764          13216          12779          13118           7391           3140 
PSO_NON_LES_P3 PSO_NON_LES_P4 PSO_NON_LES_P5 
          3910          10904          11626 
pseudo.counts.df <- as.data.frame(pseudo.counts$Spatial) %>% rownames_to_column("Gene")

Genes <- pseudo.counts.df$Gene

library(DESeq2)

groups.table <- read.csv(file="PSEUDO-BULK-DATA/groups.table.csv",stringsAsFactors = TRUE) %>% filter(Sample.ID!="") %>% column_to_rownames("Sample.ID") %>% unite("DISEASE_and_SEVERITY","GROUP_I","SEVERITY", sep = "_", remove = FALSE, na.rm = FALSE)
coldata <- groups.table[,c("DISEASE_and_SEVERITY","GROUP_I","SEVERITY","BATCH")]
# Ordering the file
counts.file <- pseudo.counts.df[,rownames(groups.table)]
#counts.file <- mutate_all(counts.file, function(x) as.numeric(as.character(x)))

group.name <- colnames(groups.table)[1]
groups.levels <- factor(groups.table[,group.name]) %>% levels()
rownames(counts.file) <- Genes
counts.final <- counts.file
# Run DE here
dds <- DESeqDataSetFromMatrix(countData = counts.final,colData=groups.table,design = ~BATCH + GROUP_I)
dds <- DESeq(dds,quiet = TRUE)
normalized.counts <- counts(dds, normalized=TRUE)
colSums(normalized.counts)
     HV1_S1_R1      HV2_S1_R1         HV3_S1         HV2_S2      HV1_S1_R2      HV2_S1_R2         HV3_S2  PSO_LES_P2_R1 PSO_NON_LES_P2  PSO_LES_P2_R2 
       1794826        1740896        1544520        1374940        1413584        1427695        1596350        1743215        1695625        1682631 
    PSA_LES_P5  PSA_LES_P2_R1 PSA_NON_LES_P2  PSA_LES_P2_R2     PSO_LES_P3 PSO_NON_LES_P3     PSA_LES_P4 PSA_NON_LES_P4     PSO_LES_P6     PSO_LES_P1 
       1879940        3007601        1637527        2111038        2014346        1871857        1663323        1505774        1818696        2911079 
PSO_NON_LES_P1  PSA_LES_P3_R1 PSA_NON_LES_P3  PSA_LES_P3_R2     PSO_LES_P5 PSO_NON_LES_P5     PSA_LES_P1 PSA_NON_LES_P1     PSO_LES_P4 PSO_NON_LES_P4 
       1583144        1958126        1684964        2165046        2297236        1663951        2658807        1609042        1845900        1512737 
vsd <- vst(dds, blind=TRUE)

FIGURE 6B / 6C

PCA plots showing clustering of samples based on disease group and severity / PASI score.

plotPCA(vsd, intgroup=c("GROUP_I","GROUP_II"))+ scale_color_manual(values=c("dimgray","#cc3333","#ffcc33","#ff9999","#ff9933"))


pcaData <- plotPCA(vsd, intgroup=c("SEVERITY","PASI_SCORE","DISEASE_and_SEVERITY"), returnData=TRUE)
percentVar <- round(100 * attr(pcaData, "percentVar"))

#pdf("ALL_SAMPLES_PCA_PLOT.pdf",height = 8,width = 10)
ggplot(pcaData, aes(PC1, PC2, fill=PASI_SCORE, shape=DISEASE_and_SEVERITY)) +
  geom_point(size=3) +
  xlab(paste0("PC1: ",percentVar[1],"% variance")) +
  ylab(paste0("PC2: ",percentVar[2],"% variance")) + 
  coord_fixed() +
  scale_shape_manual(values=c(21,22,23,24,25))

#dev.off()
sampleDists <- dist(t(assay(vsd)))

FIGURE 6A

Samples cluster by disease severity not systemic co-morbidity

library("RColorBrewer")
library("pheatmap")
sampleDistMatrix <- as.matrix(sampleDists)
rownames(sampleDistMatrix) <- paste(vsd$GROUP_I, vsd$SEVERITY,vsd$GROUP_II, sep="-")
colnames(sampleDistMatrix) <- NULL
colors <- colorRampPalette(brewer.pal(9, "RdYlBu")) (255)
#pdf("HC_WITH_HEATMAP.pdf",height = 15,width = 15)
print(pheatmap(sampleDistMatrix,
         clustering_distance_rows=sampleDists,
         clustering_distance_cols=sampleDists,
         col=colors))

#dev.off()

FIGURE S9

DENDOGRAM

hc <- hclust(sampleDists)

print(plot(hc, labels=paste(vsd$GROUP_I,vsd$SEVERITY,vsd$GROUP_II,sep = ":")))
NULL

DENDOGRAMS - EXCLUDED HEALTHY SAMPLES

vsd_subset <- vsd[,vsd$GROUP_I %in% c("Non-Lesional","Lesional")]
sampleDists <- dist(t(assay(vsd_subset)))

hc <- hclust(sampleDists)

#pdf("DENDOGRAM_PS_ONLY.pdf",height = 10,width = 10)
print(plot(hc, labels=paste(vsd_subset$GROUP_I,vsd_subset$SEVERITY,vsd_subset$PASI_SCORE,sep = ":")))
NULL

#dev.off()

  ## PCA PLOT
#pdf(file="PCA_PS_ONLY.pdf",height = 8,width = 10)
plotPCA(vsd_subset, intgroup=c("GROUP_I", "SEVERITY")) + geom_text(label = vsd_subset$PASI_SCORE,nudge_x = 2, nudge_y = 2) + scale_color_manual(values=c("#ff9999","#cc3333","#ffcc33","#ff9933"))

#dev.off()

  ## PCA PLOT
#pdf(file="PCA_ALL_SAMPLES.pdf",height = 8,width = 10)
plotPCA(vsd, intgroup=c("GROUP_I", "GROUP_II")) + geom_text(label = vsd$PASI_SCORE,nudge_x = 2, nudge_y = 2) + scale_color_manual(values=c("dimgray","#cc3333","#ffcc33","#ff9999","#ff9933"))

#dev.off()
sampleDists <- dist(t(assay(vsd)))

hc <- hclust(sampleDists)

#pdf("DENDOGRAM_ALL_SAMPLES.pdf",height = 10,width = 10)
print(plot(hc, labels=paste(vsd$GROUP_I,vsd$SEVERITY,vsd$GROUP_II,vsd$PASI_SCORE,sep = ":")))
NULL

#dev.off()


sampleDistMatrix <- as.matrix(sampleDists)
rownames(sampleDistMatrix) <- paste(vsd$GROUP_I, vsd$SEVERITY,vsd$GROUP_II,vsd$PASI_SCORE, sep="-")
colnames(sampleDistMatrix) <- NULL
colors <- colorRampPalette( rev(brewer.pal(9, "Blues")) )(255)
#pdf("HC_ALL_SAMPLES_HEATMAP.pdf",height = 15,width = 15)
print(pheatmap(sampleDistMatrix,
         clustering_distance_rows=sampleDists,
         clustering_distance_cols=sampleDists,
         col=colors))

#dev.off()
res.1<- results(dds,contrast=c('GROUP_I','Lesional','Healthy Skin')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
res.2<- results(dds,contrast=c('GROUP_I','Lesional','Non-Lesional')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
res.3<- results(dds,contrast=c('GROUP_I','Non-Lesional','Healthy Skin')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
res.1<- results(dds_2,contrast=c('GROUP_I','Lesional','Healthy Skin')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
res.2<- results(dds_2,contrast=c('GROUP_I','Lesional','Non-Lesional')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
res.3<- results(dds_2,contrast=c('GROUP_I','Non-Lesional','Healthy Skin')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
dds$group <- factor(paste0(dds$GROUP_I, dds$SEVERITY))
design(dds) <- ~ group

dds <- DESeq(dds) 
res.1_v2<- results(dds,contrast=c('group','LesionalModerate-severe','Healthy SkinHealthy')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
res.2_v2<- results(dds,contrast=c('group','LesionalMild','Healthy SkinHealthy')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
#res.2<- results(dds,contrast=c('GROUP_I','Lesional','Non-Lesional')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
#res.3<- results(dds,contrast=c('GROUP_I','Non-Lesional','Healthy Skin')) %>% as.data.frame() %>% rownames_to_column("Gene") %>% dplyr::filter(padj<0.1)
Group.data <- table(skin_data.hm.sct@meta.data$DISEASE_STATUS,skin_data.hm.sct@meta.data$Spatial.regions) %>% as.data.frame()  
colnames(Group.data) <- c("Group","Cluster","Frquency")
write.csv(Group.data,"CLUSTER_FREQUENCY_BY_GROUP.csv")
cluster.labels <- unique(skin_data.hm.sct@meta.data$Spatial.regions) %>% as.vector() %>% sort(decreasing = TRUE)
cluster.labels
 [1] "9 Adipose"                            "8 Hair follicle and sebaceous glands" "7 Epidermis"                         
 [4] "6 Mixed"                              "5 Connective tissue"                  "4 Epidermis"                         
 [7] "3 Epidermis"                          "2 Eccrine + melanocyte precursors"    "16 Adipose, fibroblasts"             
[10] "15 Mixed"                             "14 Smooth muscle"                     "13 Immunoglobulins, fibroblasts"     
[13] "12 Endothelial cells"                 "11 Smooth muscle"                     "10 Suprabasal keratinocytes"         
[16] "1 Macs + fibroblasts"                 "0 Fibroblasts"                       
cluster.labels.filtered <- c("9 Adipose","10 Suprabasal keratinocytes","11 Smooth muscle","12 Endothelial cells","13 Immunoglobulins, fibroblasts","14 Smooth muscle","15 Mixed","16 Adipose, fibroblasts")

Figure S9

CLUSTER SPECIFIC (PSEUDO-BULK) PCA-plots

PART 1

for(x in cluster.labels){
  subset.data <- subset(skin_data.hm.sct,Spatial.regions %in% c(x))
  dds <- pseudo_bulk_out(subset.data,group_label = "sample.id",groups_tbl_path = "PSEUDO-BULK-DATA/groups.table.csv")
  if(!is.null(dds)){
    tryCatch({
      vsd <- vst(dds, blind=TRUE)
      
      # ALL PSORIASIS SAMPLES
      vsd_subset <- vsd[,vsd$GROUP_I %in% c("Lesional","Non-Lesional")]
      
        ## PCA PLOT
      #pdf(file=paste("PSEUDO_BULK_OUTPUT/ALL_PS_SAMPLES/",x,"_PCA_PLOT_PSEUDOBULK_ALL_SAMPLES.pdf"),height = 8,width = 10)
      print(plotPCA(vsd_subset, intgroup=c("GROUP_I", "SEVERITY"))+ ggtitle(paste("PCA Plot for -",x))+ scale_color_manual(values=c("#ff9999","#cc3333","#ffcc33","#ff9933")))
      #dev.off()
      
  }, error=function(e){ skip_to_next <<- TRUE})
  }
  
}

PART-2

#cluster.ids <- skin_data.hm.sct@meta.data$Spatial.regions %>% unique() %>% as.vector()
for(x in cluster.labels.filtered){
  subset.data <- subset(skin_data.hm.sct,Spatial.regions %in% c(x))
  dds <- pseudo_bulk_out(subset.data,group_label = "sample.id",groups_tbl_path = "PSEUDO-BULK-DATA/groups.table.csv")
  if(!is.null(dds)){
    tryCatch({
      vsd <- vst(dds, blind=TRUE,nsub = 100)
      normalized.counts <- counts(dds, normalized=TRUE)
      
      # ONLY PSORIASIS SAMPLES
      vsd_subset <- vsd[,vsd$GROUP_I %in% c("Lesional","Non-Lesional")]
      ## PCA PLOT
      #pdf(file=paste("PSEUDO_BULK_OUTPUT/ALL_SAMPLES(VERSION_2)/",x,"_PCA_PLOT_PSEUDOBULK_ALL_SAMPLES.pdf"),height = 8,width = 10)
      print(plotPCA(vsd_subset, intgroup=c("GROUP_I", "SEVERITY"))+ ggtitle(paste("PCA Plot for -",x))) 
      #dev.off()
      
  }, error=function(e){ skip_to_next <<- TRUE})
  }
  
}

FIGURE 8A

subset.data <- subset(skin_data.hm.sct,Spatial.regions %in% c("1 Macs + fibroblasts"))

dds <- pseudo_bulk_out(subset.data,group_label = "sample.id",groups_tbl_path = "PSEUDO-BULK-DATA/groups.table.csv")

vsd <- vst(dds, blind=TRUE,nsub = 100)

# ALL PSORIASIS SAMPLES
vsd_subset_2 <- vsd[,vsd$GROUP_I %in% c("Lesional","Non-Lesional")]
#pdf(file=paste("PSEUDO_BULK_OUTPUT/ALL_PS_SAMPLES/","1 Macs + fibroblasts","_PCA_PLOT_PSEUDOBULK_ALL_SAMPLES(WITH_LABELS)(V2).pdf"),height = 8,width = 10)
plotPCA(vsd_subset_2, intgroup=c("GROUP_I", "SEVERITY")) + geom_text(label = vsd_subset_2$PASI_SCORE,nudge_x = 0.50, nudge_y = 1) + scale_color_manual(values=c("#ff9999","#cc3333","#ffcc33","#ff9933"))

#dev.off()

#12 Endothelial cells
subset.data <- subset(skin_data.hm.sct,Spatial.regions %in% c("12 Endothelial cells"))
dds <- pseudo_bulk_out(subset.data,group_label = "sample.id",groups_tbl_path = "PSEUDO-BULK-DATA/groups.table.csv")
vsd <- vst(dds, blind=TRUE,nsub = 100)

# ALL PSORIASIS SAMPLES
vsd_subset_2 <- vsd[,vsd$GROUP_I %in% c("Lesional","Non-Lesional")]
#pdf(file=paste("PSEUDO_BULK_OUTPUT/ALL_PS_SAMPLES/","12 Endothelial cells","_PCA_PLOT_PSEUDOBULK_ALL_SAMPLES(WITH_LABELS)(V2).pdf"),height = 8,width = 10)
plotPCA(vsd_subset_2, intgroup=c("GROUP_I", "SEVERITY")) + geom_text(label = vsd_subset_2$PASI_SCORE,nudge_x = 0.50, nudge_y = 1)  + scale_color_manual(values=c("#ff9999","#cc3333","#ffcc33","#ff9933"))

#dev.off()
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBQUyBTQU1QTEVTIFBBUlQgNCAKCiMjIFBTRVVETy1CVUxLIEFOQUxZU0lTCgojIyMgKkRJRkZFUkVOVElBTCBURVNUSU5HIEJFVFdFRU4gQ09ORElUSU9OUyAtIExFU0lPTkFMLCBOT04tTEVTSU9OQUwgQU5EIEhFQUxUSFkqCgp8IEZJR1VSRSBOTyB8IERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExJTksgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAp8IDZBICAgICAgICB8IEhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIGJhc2VkIGhlYXRtYXAgZm9yIGFsbCBzYW1wbGVzICB8IFtsaW5rXSgjNmEpICB8CnwgNkIgICAgICAgIHwgUENBIHBsb3QgZm9yIGFsbCBzYW1wbGVzIC0gZ3JvdXBlZCBieSBQUyBncm91cCAgICAgICAgIHwgW2xpbmtdKCM2YikgIHwKfCA2QyAgICAgICAgfCBQQ0EgcGxvdCBmb3IgYWxsIHNhbXBsZXMgLSBncm91cGVkIGJ5IERpc2Vhc2Ugc2V2ZXJpdHkgfCBbbGlua10oIzZjKSAgfAp8IFM5ICAgICAgICB8IERlbmRvZ3JhbSBmb3IgYWxsIHNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtsaW5rXSgjczEwKSB8CnwgUzEwICAgICAgIHwgUENBIHBsb3RzIC0gcGVyIGNsdXN0ZXIgYmFzcyAoUFMgc2FtcGxlcyBvbmx5KSAgICAgICAgIHwgW2xpbmtdKCNzMTApIHwKCkltcG9ydCB0aGUgU2V1cmF0IG9iamVjdAoKYGBge3J9CnNraW5fZGF0YS5obS5zY3QgPC0gcmVhZFJEUyhmaWxlPSIuLi9BTExfU1BBVElBTF9TQU1QTEVTLlJEUyIpCmBgYAoKUkUtTk9STUFMSVpJTkcgVE8gUkVHUkVTUyBPVVQgQkFUQ0gKCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSx9CnNraW5fZGF0YS5obS5zY3RfcmVfbm9ybWFsaXplZCA8LSBTQ1RyYW5zZm9ybShza2luX2RhdGEuaG0uc2N0LGFzc2F5ID0gIlNwYXRpYWwiLG5ldy5hc3NheS5uYW1lID0iU0NUX0JBVENIX1JFR1JFU1NFRCIsdmFycy50by5yZWdyZXNzID0gYygic2FtcGxlLmlkIikpCmBgYAoKSURFTlRJRlkgREUgR0VORVMgLSBMRVNJT05BTCBWUyBIRUFMVEhZCgpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CkxFU192c19IRUFMVEhZX3YxIDwtIEZpbmRNYXJrZXJzKHNraW5fZGF0YS5obS5zY3RfcmVfbm9ybWFsaXplZCxncm91cC5ieSA9ICJESVNFQVNFX1NUQVRVUyIsaWRlbnQuMSA9ICJMZXNpb25hbCIsaWRlbnQuMiA9ICJIZWFsdGh5IHNraW4iKQpMRVNfdnNfSEVBTFRIWV92MiAgPC0gRmluZE1hcmtlcnMoc2tpbl9kYXRhLmhtLnNjdF9yZV9ub3JtYWxpemVkLGdyb3VwLmJ5ID0gIkRJU0VBU0VfU1RBVFVTIixpZGVudC4xID0gIkxlc2lvbmFsIixpZGVudC4yID0gIkhlYWx0aHkgc2tpbiIpCmBgYAoKYGBge3J9Ck5PTl9MRVNfdnNfSEVBTFRIWSA8LSBGaW5kTWFya2Vycyhza2luX2RhdGEuaG0uc2N0X3JlX25vcm1hbGl6ZWQsZ3JvdXAuYnkgPSAiRElTRUFTRV9TVEFUVVMiLGlkZW50LjEgPSAiTm9uLUxlc2lvbmFsIixpZGVudC4yID0gIkhlYWx0aHkgc2tpbiIpCkxFU19WU19OT05fTEVTIDwtIEZpbmRNYXJrZXJzKHNraW5fZGF0YS5obS5zY3RfcmVfbm9ybWFsaXplZCxncm91cC5ieSA9ICJESVNFQVNFX1NUQVRVUyIsaWRlbnQuMSA9ICJMZXNpb25hbCIsaWRlbnQuMiA9ICJOb24tTGVzaW9uYWwiKQpgYGAKCmBgYHtyfQpza2luX2RhdGEuaG0uc2N0X3JlX25vcm1hbGl6ZWQgPC0gTm9ybWFsaXplRGF0YShza2luX2RhdGEuaG0uc2N0X3JlX25vcm1hbGl6ZWQsYXNzYXkgPSAiU3BhdGlhbCIpCkxFU192c19IRUFMVEhZX3YzIDwtIEZpbmRNYXJrZXJzKHNraW5fZGF0YS5obS5zY3RfcmVfbm9ybWFsaXplZCxncm91cC5ieSA9ICJESVNFQVNFX1NUQVRVUyIsaWRlbnQuMSA9ICJMZXNpb25hbCIsaWRlbnQuMiA9ICJIZWFsdGh5IHNraW4iLGFzc2F5ID0gIlNwYXRpYWwiLHRlc3QudXNlID0gIkxSIixsYXRlbnQudmFycz1jKCJCYXRjaCIpKQoKTk9OX0xFU192c19IRUFMVEhZX3YzIDwtIEZpbmRNYXJrZXJzKHNraW5fZGF0YS5obS5zY3RfcmVfbm9ybWFsaXplZCxncm91cC5ieSA9ICJESVNFQVNFX1NUQVRVUyIsaWRlbnQuMSA9ICJOb24tTGVzaW9uYWwiLGlkZW50LjIgPSAiSGVhbHRoeSBza2luIixhc3NheSA9ICJTcGF0aWFsIix0ZXN0LnVzZSA9ICJMUiIsbGF0ZW50LnZhcnM9YygiQmF0Y2giKSkKCkxFU19WU19OT05fTEVTX3YzIDwtIEZpbmRNYXJrZXJzKHNraW5fZGF0YS5obS5zY3QsZ3JvdXAuYnkgPSAiRElTRUFTRV9TVEFUVVMiLGlkZW50LjEgPSAiTGVzaW9uYWwiLGlkZW50LjIgPSAiTm9uLUxlc2lvbmFsIixhc3NheSA9ICJTcGF0aWFsIix0ZXN0LnVzZSA9ICJMUiIsbGF0ZW50LnZhcnM9YygiQmF0Y2giKSkKYGBgCgpgYGB7cn0KTEVTX3ZzX0hFQUxUSFlfdjQgPC0gRmluZE1hcmtlcnMoc2tpbl9kYXRhLmhtLnNjdF9yZV9ub3JtYWxpemVkLGdyb3VwLmJ5ID0gIkRJU0VBU0VfU1RBVFVTIixpZGVudC4xID0gIkxlc2lvbmFsIixpZGVudC4yID0gIkhlYWx0aHkgc2tpbiIsYXNzYXkgPSAiU3BhdGlhbCIsdGVzdC51c2UgPSAid2lsY294IikKCk5PTl9MRVNfdnNfSEVBTFRIWV92NCA8LSBGaW5kTWFya2Vycyhza2luX2RhdGEuaG0uc2N0X3JlX25vcm1hbGl6ZWQsZ3JvdXAuYnkgPSAiRElTRUFTRV9TVEFUVVMiLGlkZW50LjEgPSAiTm9uLUxlc2lvbmFsIixpZGVudC4yID0gIkhlYWx0aHkgc2tpbiIsYXNzYXkgPSAiU3BhdGlhbCIsdGVzdC51c2UgPSAid2lsY294IikKCkxFU19WU19OT05fTEVTX3Y0IDwtIEZpbmRNYXJrZXJzKHNraW5fZGF0YS5obS5zY3QsZ3JvdXAuYnkgPSAiRElTRUFTRV9TVEFUVVMiLGlkZW50LjEgPSAiTGVzaW9uYWwiLGlkZW50LjIgPSAiTm9uLUxlc2lvbmFsIixhc3NheSA9ICJTcGF0aWFsIix0ZXN0LnVzZSA9ICJ3aWxjb3giKQpgYGAKCmBgYHtyfQpMRVNfdnNfSEVBTFRIWV92M19maWx0ZXJlZCA8LSBMRVNfdnNfSEVBTFRIWV92MyAlPiUgZmlsdGVyKHBfdmFsX2Fkajw9MC4xKQpOT05fTEVTX3ZzX0hFQUxUSFlfdjNfZmlsdGVyZWQgPC0gTk9OX0xFU192c19IRUFMVEhZX3YzICU+JSBmaWx0ZXIocF92YWxfYWRqPD0wLjEpCkxFU19WU19OT05fTEVTX3YzX2ZpbHRlcmVkIDwtIExFU19WU19OT05fTEVTX3YzICU+JSBmaWx0ZXIocF92YWxfYWRqPD0wLjEpCgpMRVNfdnNfSEVBTFRIWV92NF9maWx0ZXJlZCA8LSBMRVNfdnNfSEVBTFRIWV92NCAlPiUgZmlsdGVyKHBfdmFsX2Fkajw9MC4xKQpOT05fTEVTX3ZzX0hFQUxUSFlfdjRfZmlsdGVyZWQgPC0gTk9OX0xFU192c19IRUFMVEhZX3Y0ICU+JSBmaWx0ZXIocF92YWxfYWRqPD0wLjEpCkxFU19WU19OT05fTEVTX3Y0X2ZpbHRlcmVkIDwtIExFU19WU19OT05fTEVTX3Y0ICU+JSBmaWx0ZXIocF92YWxfYWRqPD0wLjEpCmBgYAoKYGBge3IsZXZhbD1GQUxTRX0Kd3JpdGUuY3N2KExFU192c19IRUFMVEhZX3YzX2ZpbHRlcmVkLGZpbGU9IkRFX1JFU1VMVFNfTEVTX3ZzX0hFQUxUSFlfKExSX1RFU1QpLmNzdiIpCndyaXRlLmNzdihOT05fTEVTX3ZzX0hFQUxUSFlfdjNfZmlsdGVyZWQsZmlsZT0iREVfUkVTVUxUU19OT05fTEVTX3ZzX0hFQUxUSFlfKExSX1RFU1QpLmNzdiIpCndyaXRlLmNzdihMRVNfVlNfTk9OX0xFU192M19maWx0ZXJlZCxmaWxlPSJERV9SRVNVTFRTX0xFU19WU19OT05fTEVTXyhMUl9URVNUKS5jc3YiKQoKd3JpdGUuY3N2KExFU192c19IRUFMVEhZX3Y0X2ZpbHRlcmVkLGZpbGU9IkRFX1JFU1VMVFNfTEVTX3ZzX0hFQUxUSFlfKFdJTENPWF9URVNUKS5jc3YiKQp3cml0ZS5jc3YoTk9OX0xFU192c19IRUFMVEhZX3Y0X2ZpbHRlcmVkLGZpbGU9IkRFX1JFU1VMVFNfTk9OX0xFU192c19IRUFMVEhZXyhXSUxDT1hfVEVTVCkuY3N2IikKd3JpdGUuY3N2KExFU19WU19OT05fTEVTX3Y0X2ZpbHRlcmVkLGZpbGU9IkRFX1JFU1VMVFNfTEVTX1ZTX05PTl9MRVNfKFdJTENPWF9URVNUKS5jc3YiKQpgYGAKCmBgYHtyfQpMRVNfdnNfSEVBTFRIWV92NCA8LSBGaW5kTWFya2Vycyhza2luX2RhdGEuaG0uc2N0X3JlX25vcm1hbGl6ZWQsZ3JvdXAuYnkgPSAiRElTRUFTRV9TVEFUVVMiLGlkZW50LjEgPSAiTGVzaW9uYWwiLGlkZW50LjIgPSAiSGVhbHRoeSBza2luIixhc3NheSA9ICJTcGF0aWFsIix0ZXN0LnVzZSA9ICJMUiIsbGF0ZW50LnZhcnM9Yygic2FtcGxlLmlkIikpCk5PTl9MRVNfdnNfSEVBTFRIWV92NCA8LSBGaW5kTWFya2Vycyhza2luX2RhdGEuaG0uc2N0X3JlX25vcm1hbGl6ZWQsZ3JvdXAuYnkgPSAiRElTRUFTRV9TVEFUVVMiLGlkZW50LjEgPSAiTm9uLUxlc2lvbmFsIixpZGVudC4yID0gIkhlYWx0aHkgc2tpbiIsYXNzYXkgPSAiU3BhdGlhbCIsdGVzdC51c2UgPSAiTFIiLGxhdGVudC52YXJzPWMoInNhbXBsZS5pZCIpKQpMRVNfVlNfTk9OX0xFU192NCA8LSBGaW5kTWFya2Vycyhza2luX2RhdGEuaG0uc2N0LGdyb3VwLmJ5ID0gIkRJU0VBU0VfU1RBVFVTIixpZGVudC4xID0gIkxlc2lvbmFsIixpZGVudC4yID0gIk5vbi1MZXNpb25hbCIsYXNzYXkgPSAiU3BhdGlhbCIsdGVzdC51c2UgPSAiTFIiLGxhdGVudC52YXJzPWMoInNhbXBsZS5pZCIpKQpgYGAKCmBgYHtyfQpMRVNfdnNfSEVBTFRIWV92NF9maWx0ZXJlZCA8LSBMRVNfdnNfSEVBTFRIWV92NCAlPiUgZmlsdGVyKHBfdmFsX2Fkajw9MC4xKQpOT05fTEVTX3ZzX0hFQUxUSFlfdjRfZmlsdGVyZWQgPC0gTk9OX0xFU192c19IRUFMVEhZX3Y0ICU+JSBmaWx0ZXIocF92YWxfYWRqPD0wLjEpCkxFU19WU19OT05fTEVTX3Y0X2ZpbHRlcmVkIDwtIExFU19WU19OT05fTEVTX3Y0ICU+JSBmaWx0ZXIocF92YWxfYWRqPD0wLjEpCmBgYAoKYGBge3IsZXZhbD1GQUxTRX0Kd3JpdGUuY3N2KExFU192c19IRUFMVEhZX3Y0X2ZpbHRlcmVkLGZpbGU9IkRFX1JFU1VMVFNfTEVTX3ZzX0hFQUxUSFlfKExSX1RFU1QpKFNBTVBMRV9WQVIpLmNzdiIpCndyaXRlLmNzdihOT05fTEVTX3ZzX0hFQUxUSFlfdjRfZmlsdGVyZWQsZmlsZT0iREVfUkVTVUxUU19OT05fTEVTX3ZzX0hFQUxUSFlfKExSX1RFU1QpKFNBTVBMRV9WQVIpLmNzdiIpCndyaXRlLmNzdihMRVNfVlNfTk9OX0xFU192NF9maWx0ZXJlZCxmaWxlPSJERV9SRVNVTFRTX0xFU19WU19OT05fTEVTXyhMUl9URVNUKShTQU1QTEVfVkFSKS5jc3YiKQpgYGAKCiMjIFBTRVVETy1CVUxLIEFQUFJPQUNICgpJbXBvcnQgUHNldWRvLWNvdW50cyBmcm9tIHRoZSBTZXVyYXQgb2JqZWN0CgpgYGB7cn0KcHNldWRvLmNvdW50cyA8LSBTZXVyYXQ6OjpQc2V1ZG9idWxrRXhwcmVzc2lvbihvYmplY3QgPSBza2luX2RhdGEuaG0uc2N0LGFzc2F5cyA9ICJTcGF0aWFsIixncm91cC5ieSA9ICJzYW1wbGUuaWQiLHNsb3QgPSAiY291bnRzIixwYi5tZXRob2QgPSAiYWdncmVnYXRlIikgCgpzdW1tYXJ5KGNvbFN1bXMocHNldWRvLmNvdW50cyRTcGF0aWFsKSkKYGBgCgpgYGB7cn0KY29sU3Vtcyhwc2V1ZG8uY291bnRzJFNwYXRpYWw+MTApCmBgYAoKYGBge3J9CnBzZXVkby5jb3VudHMuZGYgPC0gYXMuZGF0YS5mcmFtZShwc2V1ZG8uY291bnRzJFNwYXRpYWwpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKQoKR2VuZXMgPC0gcHNldWRvLmNvdW50cy5kZiRHZW5lCgpsaWJyYXJ5KERFU2VxMikKCmdyb3Vwcy50YWJsZSA8LSByZWFkLmNzdihmaWxlPSJQU0VVRE8tQlVMSy1EQVRBL2dyb3Vwcy50YWJsZS5jc3YiLHN0cmluZ3NBc0ZhY3RvcnMgPSBUUlVFKSAlPiUgZmlsdGVyKFNhbXBsZS5JRCE9IiIpICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoIlNhbXBsZS5JRCIpICU+JSB1bml0ZSgiRElTRUFTRV9hbmRfU0VWRVJJVFkiLCJHUk9VUF9JIiwiU0VWRVJJVFkiLCBzZXAgPSAiXyIsIHJlbW92ZSA9IEZBTFNFLCBuYS5ybSA9IEZBTFNFKQoKYGBgCgpgYGB7cn0KY29sZGF0YSA8LSBncm91cHMudGFibGVbLGMoIkRJU0VBU0VfYW5kX1NFVkVSSVRZIiwiR1JPVVBfSSIsIlNFVkVSSVRZIiwiQkFUQ0giKV0KYGBgCgpgYGB7cn0KIyBPcmRlcmluZyB0aGUgZmlsZQpjb3VudHMuZmlsZSA8LSBwc2V1ZG8uY291bnRzLmRmWyxyb3duYW1lcyhncm91cHMudGFibGUpXQojY291bnRzLmZpbGUgPC0gbXV0YXRlX2FsbChjb3VudHMuZmlsZSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpKQoKZ3JvdXAubmFtZSA8LSBjb2xuYW1lcyhncm91cHMudGFibGUpWzFdCmdyb3Vwcy5sZXZlbHMgPC0gZmFjdG9yKGdyb3Vwcy50YWJsZVssZ3JvdXAubmFtZV0pICU+JSBsZXZlbHMoKQpgYGAKCmBgYHtyfQpyb3duYW1lcyhjb3VudHMuZmlsZSkgPC0gR2VuZXMKY291bnRzLmZpbmFsIDwtIGNvdW50cy5maWxlCmBgYAoKYGBge3IsLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KIyBSdW4gREUgaGVyZQpkZHMgPC0gREVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGEgPSBjb3VudHMuZmluYWwsY29sRGF0YT1ncm91cHMudGFibGUsZGVzaWduID0gfkJBVENIICsgR1JPVVBfSSkKZGRzIDwtIERFU2VxKGRkcyxxdWlldCA9IFRSVUUpCmBgYAoKYGBge3J9Cm5vcm1hbGl6ZWQuY291bnRzIDwtIGNvdW50cyhkZHMsIG5vcm1hbGl6ZWQ9VFJVRSkKY29sU3Vtcyhub3JtYWxpemVkLmNvdW50cykKYGBgCgpgYGB7cn0KdnNkIDwtIHZzdChkZHMsIGJsaW5kPVRSVUUpCmBgYAoKIyMjIEZJR1VSRSA2QiAvIDZDIDxhIGlkPSI2YiI+PC9hPjxhIGlkPSI2YyI+PC9hPgoKUENBIHBsb3RzIHNob3dpbmcgY2x1c3RlcmluZyBvZiBzYW1wbGVzIGJhc2VkIG9uIGRpc2Vhc2UgZ3JvdXAgYW5kIHNldmVyaXR5IC8gUEFTSSBzY29yZS4KCmBgYHtyfQpwbG90UENBKHZzZCwgaW50Z3JvdXA9YygiR1JPVVBfSSIsIkdST1VQX0lJIikpKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImRpbWdyYXkiLCIjY2MzMzMzIiwiI2ZmY2MzMyIsIiNmZjk5OTkiLCIjZmY5OTMzIikpCgpwY2FEYXRhIDwtIHBsb3RQQ0EodnNkLCBpbnRncm91cD1jKCJTRVZFUklUWSIsIlBBU0lfU0NPUkUiLCJESVNFQVNFX2FuZF9TRVZFUklUWSIpLCByZXR1cm5EYXRhPVRSVUUpCnBlcmNlbnRWYXIgPC0gcm91bmQoMTAwICogYXR0cihwY2FEYXRhLCAicGVyY2VudFZhciIpKQoKI3BkZigiQUxMX1NBTVBMRVNfUENBX1BMT1QucGRmIixoZWlnaHQgPSA4LHdpZHRoID0gMTApCmdncGxvdChwY2FEYXRhLCBhZXMoUEMxLCBQQzIsIGZpbGw9UEFTSV9TQ09SRSwgc2hhcGU9RElTRUFTRV9hbmRfU0VWRVJJVFkpKSArCiAgZ2VvbV9wb2ludChzaXplPTMpICsKICB4bGFiKHBhc3RlMCgiUEMxOiAiLHBlcmNlbnRWYXJbMV0sIiUgdmFyaWFuY2UiKSkgKwogIHlsYWIocGFzdGUwKCJQQzI6ICIscGVyY2VudFZhclsyXSwiJSB2YXJpYW5jZSIpKSArIAogIGNvb3JkX2ZpeGVkKCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXM9YygyMSwyMiwyMywyNCwyNSkpCiNkZXYub2ZmKCkKYGBgCgpgYGB7cn0Kc2FtcGxlRGlzdHMgPC0gZGlzdCh0KGFzc2F5KHZzZCkpKQpgYGAKCiMjIyBGSUdVUkUgNkEgPGEgaWQ9IjZhIj48L2E+CgojIyMgU2FtcGxlcyBjbHVzdGVyIGJ5IGRpc2Vhc2Ugc2V2ZXJpdHkgbm90IHN5c3RlbWljIGNvLW1vcmJpZGl0eQoKYGBge3J9CmxpYnJhcnkoIlJDb2xvckJyZXdlciIpCmxpYnJhcnkoInBoZWF0bWFwIikKc2FtcGxlRGlzdE1hdHJpeCA8LSBhcy5tYXRyaXgoc2FtcGxlRGlzdHMpCnJvd25hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIHBhc3RlKHZzZCRHUk9VUF9JLCB2c2QkU0VWRVJJVFksdnNkJEdST1VQX0lJLCBzZXA9Ii0iKQpjb2xuYW1lcyhzYW1wbGVEaXN0TWF0cml4KSA8LSBOVUxMCmNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOSwgIlJkWWxCdSIpKSAoMjU1KQojcGRmKCJIQ19XSVRIX0hFQVRNQVAucGRmIixoZWlnaHQgPSAxNSx3aWR0aCA9IDE1KQpwcmludChwaGVhdG1hcChzYW1wbGVEaXN0TWF0cml4LAogICAgICAgICBjbHVzdGVyaW5nX2Rpc3RhbmNlX3Jvd3M9c2FtcGxlRGlzdHMsCiAgICAgICAgIGNsdXN0ZXJpbmdfZGlzdGFuY2VfY29scz1zYW1wbGVEaXN0cywKICAgICAgICAgY29sPWNvbG9ycykpCiNkZXYub2ZmKCkKYGBgCgojIyMgRklHVVJFIFM5IDxhIGlkPSJzOSI+PC9hPgoKIyMgREVORE9HUkFNCgpgYGB7cixmaWcuaGVpZ2h0PTR9CmhjIDwtIGhjbHVzdChzYW1wbGVEaXN0cykKCnByaW50KHBsb3QoaGMsIGxhYmVscz1wYXN0ZSh2c2QkR1JPVVBfSSx2c2QkU0VWRVJJVFksdnNkJEdST1VQX0lJLHNlcCA9ICI6IikpKQoKYGBgCgojIyBERU5ET0dSQU1TIC0gRVhDTFVERUQgSEVBTFRIWSBTQU1QTEVTCgpgYGB7cn0KdnNkX3N1YnNldCA8LSB2c2RbLHZzZCRHUk9VUF9JICVpbiUgYygiTm9uLUxlc2lvbmFsIiwiTGVzaW9uYWwiKV0Kc2FtcGxlRGlzdHMgPC0gZGlzdCh0KGFzc2F5KHZzZF9zdWJzZXQpKSkKCmhjIDwtIGhjbHVzdChzYW1wbGVEaXN0cykKCiNwZGYoIkRFTkRPR1JBTV9QU19PTkxZLnBkZiIsaGVpZ2h0ID0gMTAsd2lkdGggPSAxMCkKcHJpbnQocGxvdChoYywgbGFiZWxzPXBhc3RlKHZzZF9zdWJzZXQkR1JPVVBfSSx2c2Rfc3Vic2V0JFNFVkVSSVRZLHZzZF9zdWJzZXQkUEFTSV9TQ09SRSxzZXAgPSAiOiIpKSkKI2Rldi5vZmYoKQoKICAjIyBQQ0EgUExPVAojcGRmKGZpbGU9IlBDQV9QU19PTkxZLnBkZiIsaGVpZ2h0ID0gOCx3aWR0aCA9IDEwKQpwbG90UENBKHZzZF9zdWJzZXQsIGludGdyb3VwPWMoIkdST1VQX0kiLCAiU0VWRVJJVFkiKSkgKyBnZW9tX3RleHQobGFiZWwgPSB2c2Rfc3Vic2V0JFBBU0lfU0NPUkUsbnVkZ2VfeCA9IDIsIG51ZGdlX3kgPSAyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI2ZmOTk5OSIsIiNjYzMzMzMiLCIjZmZjYzMzIiwiI2ZmOTkzMyIpKQojZGV2Lm9mZigpCgogICMjIFBDQSBQTE9UCiNwZGYoZmlsZT0iUENBX0FMTF9TQU1QTEVTLnBkZiIsaGVpZ2h0ID0gOCx3aWR0aCA9IDEwKQpwbG90UENBKHZzZCwgaW50Z3JvdXA9YygiR1JPVVBfSSIsICJHUk9VUF9JSSIpKSArIGdlb21fdGV4dChsYWJlbCA9IHZzZCRQQVNJX1NDT1JFLG51ZGdlX3ggPSAyLCBudWRnZV95ID0gMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImRpbWdyYXkiLCIjY2MzMzMzIiwiI2ZmY2MzMyIsIiNmZjk5OTkiLCIjZmY5OTMzIikpCiNkZXYub2ZmKCkKYGBgCgpgYGB7cn0Kc2FtcGxlRGlzdHMgPC0gZGlzdCh0KGFzc2F5KHZzZCkpKQoKaGMgPC0gaGNsdXN0KHNhbXBsZURpc3RzKQoKI3BkZigiREVORE9HUkFNX0FMTF9TQU1QTEVTLnBkZiIsaGVpZ2h0ID0gMTAsd2lkdGggPSAxMCkKcHJpbnQocGxvdChoYywgbGFiZWxzPXBhc3RlKHZzZCRHUk9VUF9JLHZzZCRTRVZFUklUWSx2c2QkR1JPVVBfSUksdnNkJFBBU0lfU0NPUkUsc2VwID0gIjoiKSkpCiNkZXYub2ZmKCkKCgpzYW1wbGVEaXN0TWF0cml4IDwtIGFzLm1hdHJpeChzYW1wbGVEaXN0cykKcm93bmFtZXMoc2FtcGxlRGlzdE1hdHJpeCkgPC0gcGFzdGUodnNkJEdST1VQX0ksIHZzZCRTRVZFUklUWSx2c2QkR1JPVVBfSUksdnNkJFBBU0lfU0NPUkUsIHNlcD0iLSIpCmNvbG5hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIE5VTEwKY29sb3JzIDwtIGNvbG9yUmFtcFBhbGV0dGUoIHJldihicmV3ZXIucGFsKDksICJCbHVlcyIpKSApKDI1NSkKI3BkZigiSENfQUxMX1NBTVBMRVNfSEVBVE1BUC5wZGYiLGhlaWdodCA9IDE1LHdpZHRoID0gMTUpCnByaW50KHBoZWF0bWFwKHNhbXBsZURpc3RNYXRyaXgsCiAgICAgICAgIGNsdXN0ZXJpbmdfZGlzdGFuY2Vfcm93cz1zYW1wbGVEaXN0cywKICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzPXNhbXBsZURpc3RzLAogICAgICAgICBjb2w9Y29sb3JzKSkKI2Rldi5vZmYoKQpgYGAKCmBgYHtyfQpyZXMuMTwtIHJlc3VsdHMoZGRzLGNvbnRyYXN0PWMoJ0dST1VQX0knLCdMZXNpb25hbCcsJ0hlYWx0aHkgU2tpbicpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKcmVzLjI8LSByZXN1bHRzKGRkcyxjb250cmFzdD1jKCdHUk9VUF9JJywnTGVzaW9uYWwnLCdOb24tTGVzaW9uYWwnKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJHZW5lIikgJT4lIGRwbHlyOjpmaWx0ZXIocGFkajwwLjEpCnJlcy4zPC0gcmVzdWx0cyhkZHMsY29udHJhc3Q9YygnR1JPVVBfSScsJ05vbi1MZXNpb25hbCcsJ0hlYWx0aHkgU2tpbicpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKYGBgCgpgYGB7cn0KcmVzLjE8LSByZXN1bHRzKGRkc18yLGNvbnRyYXN0PWMoJ0dST1VQX0knLCdMZXNpb25hbCcsJ0hlYWx0aHkgU2tpbicpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKcmVzLjI8LSByZXN1bHRzKGRkc18yLGNvbnRyYXN0PWMoJ0dST1VQX0knLCdMZXNpb25hbCcsJ05vbi1MZXNpb25hbCcpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKcmVzLjM8LSByZXN1bHRzKGRkc18yLGNvbnRyYXN0PWMoJ0dST1VQX0knLCdOb24tTGVzaW9uYWwnLCdIZWFsdGh5IFNraW4nKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJHZW5lIikgJT4lIGRwbHlyOjpmaWx0ZXIocGFkajwwLjEpCmBgYAoKYGBge3J9CmRkcyRncm91cCA8LSBmYWN0b3IocGFzdGUwKGRkcyRHUk9VUF9JLCBkZHMkU0VWRVJJVFkpKQpkZXNpZ24oZGRzKSA8LSB+IGdyb3VwCgpkZHMgPC0gREVTZXEoZGRzKSAKYGBgCgpgYGB7cn0KcmVzLjFfdjI8LSByZXN1bHRzKGRkcyxjb250cmFzdD1jKCdncm91cCcsJ0xlc2lvbmFsTW9kZXJhdGUtc2V2ZXJlJywnSGVhbHRoeSBTa2luSGVhbHRoeScpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKcmVzLjJfdjI8LSByZXN1bHRzKGRkcyxjb250cmFzdD1jKCdncm91cCcsJ0xlc2lvbmFsTWlsZCcsJ0hlYWx0aHkgU2tpbkhlYWx0aHknKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJHZW5lIikgJT4lIGRwbHlyOjpmaWx0ZXIocGFkajwwLjEpCiNyZXMuMjwtIHJlc3VsdHMoZGRzLGNvbnRyYXN0PWMoJ0dST1VQX0knLCdMZXNpb25hbCcsJ05vbi1MZXNpb25hbCcpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKI3Jlcy4zPC0gcmVzdWx0cyhkZHMsY29udHJhc3Q9YygnR1JPVVBfSScsJ05vbi1MZXNpb25hbCcsJ0hlYWx0aHkgU2tpbicpKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oIkdlbmUiKSAlPiUgZHBseXI6OmZpbHRlcihwYWRqPDAuMSkKYGBgCgpgYGB7cixldmFsPUZBTFNFfQpHcm91cC5kYXRhIDwtIHRhYmxlKHNraW5fZGF0YS5obS5zY3RAbWV0YS5kYXRhJERJU0VBU0VfU1RBVFVTLHNraW5fZGF0YS5obS5zY3RAbWV0YS5kYXRhJFNwYXRpYWwucmVnaW9ucykgJT4lIGFzLmRhdGEuZnJhbWUoKSAgCmNvbG5hbWVzKEdyb3VwLmRhdGEpIDwtIGMoIkdyb3VwIiwiQ2x1c3RlciIsIkZycXVlbmN5IikKd3JpdGUuY3N2KEdyb3VwLmRhdGEsIkNMVVNURVJfRlJFUVVFTkNZX0JZX0dST1VQLmNzdiIpCmBgYAoKYGBge3J9CmNsdXN0ZXIubGFiZWxzIDwtIHVuaXF1ZShza2luX2RhdGEuaG0uc2N0QG1ldGEuZGF0YSRTcGF0aWFsLnJlZ2lvbnMpICU+JSBhcy52ZWN0b3IoKSAlPiUgc29ydChkZWNyZWFzaW5nID0gVFJVRSkKYGBgCgpgYGB7cn0KY2x1c3Rlci5sYWJlbHMuZmlsdGVyZWQgPC0gYygiOSBBZGlwb3NlIiwiMTAgU3VwcmFiYXNhbCBrZXJhdGlub2N5dGVzIiwiMTEgU21vb3RoIG11c2NsZSIsIjEyIEVuZG90aGVsaWFsIGNlbGxzIiwiMTMgSW1tdW5vZ2xvYnVsaW5zLCBmaWJyb2JsYXN0cyIsIjE0IFNtb290aCBtdXNjbGUiLCIxNSBNaXhlZCIsIjE2IEFkaXBvc2UsIGZpYnJvYmxhc3RzIikKYGBgCgojIyMgRmlndXJlIFM5IDxhIGlkPSJzOSI+PC9hPgoKIyMjIENMVVNURVIgU1BFQ0lGSUMgKFBTRVVETy1CVUxLKSBQQ0EtcGxvdHMKCiMjIyMgUEFSVCAxCgpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLmhlaWdodCA9IDUsZmlnLndpZHRoID0gNX0KZm9yKHggaW4gY2x1c3Rlci5sYWJlbHMpewogIHN1YnNldC5kYXRhIDwtIHN1YnNldChza2luX2RhdGEuaG0uc2N0LFNwYXRpYWwucmVnaW9ucyAlaW4lIGMoeCkpCiAgZGRzIDwtIHBzZXVkb19idWxrX291dChzdWJzZXQuZGF0YSxncm91cF9sYWJlbCA9ICJzYW1wbGUuaWQiLGdyb3Vwc190YmxfcGF0aCA9ICJQU0VVRE8tQlVMSy1EQVRBL2dyb3Vwcy50YWJsZS5jc3YiKQogIGlmKCFpcy5udWxsKGRkcykpewogICAgdHJ5Q2F0Y2goewogICAgICB2c2QgPC0gdnN0KGRkcywgYmxpbmQ9VFJVRSkKICAgICAgCiAgICAgICMgQUxMIFBTT1JJQVNJUyBTQU1QTEVTCiAgICAgIHZzZF9zdWJzZXQgPC0gdnNkWyx2c2QkR1JPVVBfSSAlaW4lIGMoIkxlc2lvbmFsIiwiTm9uLUxlc2lvbmFsIildCiAgICAgIAogICAgICAgICMjIFBDQSBQTE9UCiAgICAgICNwZGYoZmlsZT1wYXN0ZSgiUFNFVURPX0JVTEtfT1VUUFVUL0FMTF9QU19TQU1QTEVTLyIseCwiX1BDQV9QTE9UX1BTRVVET0JVTEtfQUxMX1NBTVBMRVMucGRmIiksaGVpZ2h0ID0gOCx3aWR0aCA9IDEwKQogICAgICBwcmludChwbG90UENBKHZzZF9zdWJzZXQsIGludGdyb3VwPWMoIkdST1VQX0kiLCAiU0VWRVJJVFkiKSkrIGdndGl0bGUocGFzdGUoIlBDQSBQbG90IGZvciAtIix4KSkrIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI2ZmOTk5OSIsIiNjYzMzMzMiLCIjZmZjYzMzIiwiI2ZmOTkzMyIpKSkKICAgICAgI2Rldi5vZmYoKQogICAgICAKICB9LCBlcnJvcj1mdW5jdGlvbihlKXsgc2tpcF90b19uZXh0IDw8LSBUUlVFfSkKICB9CiAgCn0KYGBgCgojIyMjIFBBUlQtMgoKYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy5oZWlnaHQgPSA1LGZpZy53aWR0aCA9IDV9CiNjbHVzdGVyLmlkcyA8LSBza2luX2RhdGEuaG0uc2N0QG1ldGEuZGF0YSRTcGF0aWFsLnJlZ2lvbnMgJT4lIHVuaXF1ZSgpICU+JSBhcy52ZWN0b3IoKQpmb3IoeCBpbiBjbHVzdGVyLmxhYmVscy5maWx0ZXJlZCl7CiAgc3Vic2V0LmRhdGEgPC0gc3Vic2V0KHNraW5fZGF0YS5obS5zY3QsU3BhdGlhbC5yZWdpb25zICVpbiUgYyh4KSkKICBkZHMgPC0gcHNldWRvX2J1bGtfb3V0KHN1YnNldC5kYXRhLGdyb3VwX2xhYmVsID0gInNhbXBsZS5pZCIsZ3JvdXBzX3RibF9wYXRoID0gIlBTRVVETy1CVUxLLURBVEEvZ3JvdXBzLnRhYmxlLmNzdiIpCiAgaWYoIWlzLm51bGwoZGRzKSl7CiAgICB0cnlDYXRjaCh7CiAgICAgIHZzZCA8LSB2c3QoZGRzLCBibGluZD1UUlVFLG5zdWIgPSAxMDApCiAgICAgIG5vcm1hbGl6ZWQuY291bnRzIDwtIGNvdW50cyhkZHMsIG5vcm1hbGl6ZWQ9VFJVRSkKICAgICAgCiAgICAgICMgT05MWSBQU09SSUFTSVMgU0FNUExFUwogICAgICB2c2Rfc3Vic2V0IDwtIHZzZFssdnNkJEdST1VQX0kgJWluJSBjKCJMZXNpb25hbCIsIk5vbi1MZXNpb25hbCIpXQogICAgICAjIyBQQ0EgUExPVAogICAgICAjcGRmKGZpbGU9cGFzdGUoIlBTRVVET19CVUxLX09VVFBVVC9BTExfU0FNUExFUyhWRVJTSU9OXzIpLyIseCwiX1BDQV9QTE9UX1BTRVVET0JVTEtfQUxMX1NBTVBMRVMucGRmIiksaGVpZ2h0ID0gOCx3aWR0aCA9IDEwKQogICAgICBwcmludChwbG90UENBKHZzZF9zdWJzZXQsIGludGdyb3VwPWMoIkdST1VQX0kiLCAiU0VWRVJJVFkiKSkrIGdndGl0bGUocGFzdGUoIlBDQSBQbG90IGZvciAtIix4KSkrIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI2ZmOTk5OSIsIiNjYzMzMzMiLCIjZmZjYzMzIiwiI2ZmOTkzMyIpKSkgCiAgICAgICNkZXYub2ZmKCkKICAgICAgCiAgfSwgZXJyb3I9ZnVuY3Rpb24oZSl7IHNraXBfdG9fbmV4dCA8PC0gVFJVRX0pCiAgfQogIAp9CmBgYAoKIyMjIEZJR1VSRSA4QSA8YSBpZD0iOGEiPjwvYT4KCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcuaGVpZ2h0ID0gNSxmaWcud2lkdGggPSA1fQpzdWJzZXQuZGF0YSA8LSBzdWJzZXQoc2tpbl9kYXRhLmhtLnNjdCxTcGF0aWFsLnJlZ2lvbnMgJWluJSBjKCIxIE1hY3MgKyBmaWJyb2JsYXN0cyIpKQoKZGRzIDwtIHBzZXVkb19idWxrX291dChzdWJzZXQuZGF0YSxncm91cF9sYWJlbCA9ICJzYW1wbGUuaWQiLGdyb3Vwc190YmxfcGF0aCA9ICJQU0VVRE8tQlVMSy1EQVRBL2dyb3Vwcy50YWJsZS5jc3YiKQoKdnNkIDwtIHZzdChkZHMsIGJsaW5kPVRSVUUsbnN1YiA9IDEwMCkKCiMgQUxMIFBTT1JJQVNJUyBTQU1QTEVTCnZzZF9zdWJzZXRfMiA8LSB2c2RbLHZzZCRHUk9VUF9JICVpbiUgYygiTGVzaW9uYWwiLCJOb24tTGVzaW9uYWwiKV0KI3BkZihmaWxlPXBhc3RlKCJQU0VVRE9fQlVMS19PVVRQVVQvQUxMX1BTX1NBTVBMRVMvIiwiMSBNYWNzICsgZmlicm9ibGFzdHMiLCJfUENBX1BMT1RfUFNFVURPQlVMS19BTExfU0FNUExFUyhXSVRIX0xBQkVMUykoVjIpLnBkZiIpLGhlaWdodCA9IDgsd2lkdGggPSAxMCkKcGxvdFBDQSh2c2Rfc3Vic2V0XzIsIGludGdyb3VwPWMoIkdST1VQX0kiLCAiU0VWRVJJVFkiKSkgKyBnZW9tX3RleHQobGFiZWwgPSB2c2Rfc3Vic2V0XzIkUEFTSV9TQ09SRSxudWRnZV94ID0gMC41MCwgbnVkZ2VfeSA9IDEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjZmY5OTk5IiwiI2NjMzMzMyIsIiNmZmNjMzMiLCIjZmY5OTMzIikpCiNkZXYub2ZmKCkKCiMxMiBFbmRvdGhlbGlhbCBjZWxscwpzdWJzZXQuZGF0YSA8LSBzdWJzZXQoc2tpbl9kYXRhLmhtLnNjdCxTcGF0aWFsLnJlZ2lvbnMgJWluJSBjKCIxMiBFbmRvdGhlbGlhbCBjZWxscyIpKQpkZHMgPC0gcHNldWRvX2J1bGtfb3V0KHN1YnNldC5kYXRhLGdyb3VwX2xhYmVsID0gInNhbXBsZS5pZCIsZ3JvdXBzX3RibF9wYXRoID0gIlBTRVVETy1CVUxLLURBVEEvZ3JvdXBzLnRhYmxlLmNzdiIpCnZzZCA8LSB2c3QoZGRzLCBibGluZD1UUlVFLG5zdWIgPSAxMDApCgojIEFMTCBQU09SSUFTSVMgU0FNUExFUwp2c2Rfc3Vic2V0XzIgPC0gdnNkWyx2c2QkR1JPVVBfSSAlaW4lIGMoIkxlc2lvbmFsIiwiTm9uLUxlc2lvbmFsIildCiNwZGYoZmlsZT1wYXN0ZSgiUFNFVURPX0JVTEtfT1VUUFVUL0FMTF9QU19TQU1QTEVTLyIsIjEyIEVuZG90aGVsaWFsIGNlbGxzIiwiX1BDQV9QTE9UX1BTRVVET0JVTEtfQUxMX1NBTVBMRVMoV0lUSF9MQUJFTFMpKFYyKS5wZGYiKSxoZWlnaHQgPSA4LHdpZHRoID0gMTApCnBsb3RQQ0EodnNkX3N1YnNldF8yLCBpbnRncm91cD1jKCJHUk9VUF9JIiwgIlNFVkVSSVRZIikpICsgZ2VvbV90ZXh0KGxhYmVsID0gdnNkX3N1YnNldF8yJFBBU0lfU0NPUkUsbnVkZ2VfeCA9IDAuNTAsIG51ZGdlX3kgPSAxKSAgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNmZjk5OTkiLCIjY2MzMzMzIiwiI2ZmY2MzMyIsIiNmZjk5MzMiKSkKI2Rldi5vZmYoKQpgYGAK